# -*- coding: utf-8 -*-
# @Time     : 2021/11/12 0:43
# @Author   : Lin
# @Email    : asnllin@qq.com
# @File     : serializers.py
# @software : PyCharm

"""
    序列化器：
        本质上是一个类，和模型差不多
        用于json格式与模型对象进行互转以及校验数据
        定义的属性就是要参与转换的字段
        序列化字段可以少于或多于模型字段，字段名却必须保持一致

    序列化和反序列化：
        序列化就是模型数据转成json数据在响应给前端
        序列化流程：
            1、实例化序列化器
            2、传入instance参数，instance的值为查询集或者模型对象
            3、序列化器.data就能得到序列化后的数据
        反序列化就是前段传入的数据(json)转成模型数据进行校验和保存
        反序列化流程：
            1、实例化序列化器
            2、传入data参数，data的值为前端传入过来的数据(json)
            3、is_valid()可以校验前端传入过来的数据

"""
from rest_framework import serializers
from rest_framework.relations import StringRelatedField

from .models import Student, Classes


# 学生信息序列化器
class StudentSerializer(serializers.ModelSerializer):
    # classes = StringRelatedField(read_only=True)

    class Meta:
        model = Student                         # 指定序列化器映射的模型类
        fields = '__all__'                      # 指定映射所有字段， '__all__'表示所有字段
        # fields = ['id', 'name', 'age']      # 只映射指定字段
        # exclude = ['id']                    # 过滤不需要映射的字段
        extra_kwargs = {
            'age': {'min_value': 0, 'max_value': 200},       # 可以修改指定字段的规则
            # 'sex': {'required': True},
        }

    # 追加额外的校验逻辑, 单个字段校验使用
    def validate_name(self, value):                 # 要校验age就把name改为age
        if 'python' not in value.lower():
            raise serializers.ValidationError('name error')
        return value

    # 对象级别的额外校验，多个字段校验使用
    # def validate(self, data):
    #     if 'python' not in data['name'].lower():     # 要校验age就把name改为age
    #         raise serializers.ValidationError('name error')
    #     return data


# 班级信息序列化器
class ClassesSerializer(serializers.ModelSerializer):
    student_set = StudentSerializer(many=True)

    class Meta:
        model = Classes
        fields = '__all__'

    def validate_name(self, value):
        if '班' not in value:
            raise serializers.ValidationError('班级名需带有班字')
        return value












